<script>
    function asyncFn(){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve({states:200,msg:"登陆成功"})
            },3000)
        })
    }
    function asyncFn2(){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve({states:200,msg:"获取列表成功"})
            },2000)
        })
    }
    // console.log(1);
    // async function getData(){
    //     console.log(2);
    //     let data=await asyncFn()
    //     console.log(3);
    //     console.log(data);
    //     console.log(4);
    // }
    // console.log(5);
    // getData()



    //预解析：代码先执行声明操作，再执行赋值操作
    /* 
    var a=1
    var b=2
    执行顺序是：var a,var b,然后再执行赋值操作a=1,b=2
     */
    function* getData(){  //用*标记function表示将函数标记成generator
        console.log(1);
       const val1= yield  asyncFn()  //yield产生
        console.log(val1);
       const val2= yield  asyncFn2()
       console.log(val2);
    }

    //generator可以将异步变成同步


    let it=getData()//返回generator迭代器(iterator)
    //将指针指向第一个(yield)数据结构的成员
    //console.log(it.next());  // {value: Promise, done: false} 即it.next().valve才能得到·Promise

//代码从上往下执行，先输出1，然后遇到yield代码暂停，还没有做赋值操作，将asyncFn传给了it.next(),手动调用it.next()代码才可以继续往下执行
//然后.then，将结果传给了第二个it.next，res将值传给了第一个yield,然后进行赋值操作，代码继续往下执行，遇到yield,代码暂停。。。以此类推
    it.next().value.then(res=>{
        it.next(res).value.then(res=>{
            it.next(res)
        })
    })
</script>